package com.seven.z7.logviewer.xml;

import java.io.File;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.seven.z7.logviewer.controls.Menu;

/**
 * 
 * @author aprokofjev
 * 
 */
public class XMLMenuParser extends XMLParser {

    private Menu mMenu;

    public XMLMenuParser(File file, Menu menu) throws SAXException, ParserConfigurationException, IOException {
        super(file);
        mMenu = menu;
    }

    @Override
    public void parse() {
        parseNode(getRootNode(), null);
    }

    private void parseNode(Node node, JMenu menu) {
        if (node.hasChildNodes()) {
            NodeList list = node.getChildNodes();
            for (int i = 0; i < list.getLength(); i++) {
                Node n = list.item(i);
                String text = getAttribute(n, NODE_ATTR_TEXT);
                String mnemonic = getAttribute(n, NODE_ATTR_MNEMONIC);

                if (n.getNodeType() == Node.ELEMENT_NODE) {
                    if (n.getNodeName().equals(NODE_MENU)) {
                        menu = new JMenu(text);
                        if (mnemonic.length() == 1) {
                            menu.setMnemonic(mnemonic.charAt(0));
                        }
                        mMenu.add(menu);
                        parseNode(n, menu);
                    } else if (n.getNodeName().equals(NODE_SUB_MENU)) {
                        JMenu submenu = new JMenu(text);
                        if (mnemonic.length() == 1) {
                            submenu.setMnemonic(mnemonic.charAt(0));
                        }
                        menu.add(submenu);
                        parseNode(n, submenu);
                    } else if (n.getNodeName().equals(NODE_ITEM)) {
                        if (text.equals(SEPARATOR)) {
                            menu.add(new JSeparator());
                        } else {
                            JMenuItem item = new JMenuItem(text);
                            item.setEnabled(getBooleanAttribute(n, NODE_ATTR_ENABLE));
                            if (mnemonic.length() == 1) {
                                item.setMnemonic(mnemonic.charAt(0));
                            }
                            int keyCode = getIntValue(n, NODE_ATTR_KEY_CODE);
                            if (keyCode != 0) {
                                KeyStroke ks = KeyStroke.getKeyStroke(keyCode, getIntValue(n, NODE_ATTR_MODIFIER));

                                item.setAccelerator(ks);
                            }
                            String iconPath = getAttribute(n, NODE_ATTR_ICON);
                            ImageIcon icon = new ImageIcon(getClass().getResource(iconPath));
                            item.setIcon(icon);
                            item.addActionListener(mMenu);
                            menu.add(item);
                        }
                        parseNode(n, menu);
                    }
                }
            }
        }
    }
}
